<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.3" />
<title>Gerrit Code Review - REST API</title>
<style type="text/css">
/* Sans-serif font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
div#toctitle,
span#author, span#revnumber, span#revdate, span#revremark,
div#footer {
  font-family: Arial,Helvetica,sans-serif;
}

/* Serif font. */
div.sectionbody {
  font-family: Georgia,"Times New Roman",Times,serif;
}

/* Monospace font. */
tt {
  font-size: inherit;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

tt {
  font-size: inherit;
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revnumber, span#revdate, span#revremark {
}

div#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #777777;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  div#footer-badges { display: none; }
}

div#toc {
  margin-bottom: 2.5em;
}

div#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){asciidoc.footnotes(); asciidoc.toc(2);}
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  var cont = document.getElementById("content");
  var noteholder = document.getElementById("footnotes");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      // Use [\s\S] in place of . so multi-line matches work.
      // Because JavaScript has no s (dotall) regex flag.
      note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      spans[i].innerHTML =
        "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
        "' title='View footnote' class='footnote'>" + n + "</a>]";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
}

}
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Gerrit Code Review - REST API</h1>
<span id="revnumber">version 2.5</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit Code Review comes with a REST like API available over HTTP.
The API is suitable for automated tools to build upon, as well as
supporting some ad-hoc scripting use cases.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_protocol_details">Protocol Details</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="authentication">Authentication</h3>
<div class="paragraph"><p>By default all REST endpoints assume anonymous access and filter
results to correspond to what anonymous users can read (which may
be nothing at all).</p></div>
<div class="paragraph"><p>Users (and programs) may authenticate using HTTP authentication by
supplying the HTTP password from the user&#8217;s account settings page.
Gerrit by default uses HTTP digest authentication. To authenticate,
prefix the endpoint URL with <tt>/a/</tt>. For example to authenticate to
<tt>/projects/</tt> request URL <tt>/a/projects/</tt>.</p></div>
</div>
<div class="sect2">
<h3 id="output">Output Format</h3>
<div class="paragraph"><p>Most APIs return text format by default. JSON can be requested
by setting the <tt>Accept</tt> HTTP request header to include
<tt>application/json</tt>, for example:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /projects/ HTTP/1.0
  Accept: application/json</tt></pre>
</div></div>
<div class="paragraph"><p>JSON responses are encoded using UTF-8 and use content type
<tt>application/json</tt>. The JSON response body starts with a magic prefix
line that must be stripped before feeding the rest of the response
body to a JSON parser:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  )]}'
  [ ... valid JSON ... ]</tt></pre>
</div></div>
<div class="paragraph"><p>The default JSON format is <tt>JSON_COMPACT</tt>, which skips unnecessary
whitespace. This is not the easiest format for a human to read. Many
examples in this documentation use <tt>format=JSON</tt> as a query parameter
to obtain pretty formatting in the response. Producing (and parsing)
the compact format is more efficient, so most tools should prefer the
default compact format.</p></div>
<div class="paragraph"><p>Responses will be gzip compressed by the server if the HTTP
<tt>Accept-Encoding</tt> request header is set to <tt>gzip</tt>. This may
save on network transfer time for larger responses.</p></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_endpoints">Endpoints</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="accounts_self_capabilities">/accounts/self/capabilities (Account Capabilities)</h3>
<div class="paragraph"><p>Returns the global capabilities (such as <tt>createProject</tt> or
<tt>createGroup</tt>) that are enabled for the calling user. This can be used
by UI tools to discover if administrative features are available
to the caller, so they can hide (or show) relevant UI actions.</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /accounts/self/capabilities?format=JSON HTTP/1.0

  )]}'
  {
    "queryLimit": {
      "min": 0,
      "max": 500
    }
  }</tt></pre>
</div></div>
<div class="paragraph"><p>Administrator that has authenticated with digest authentication:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /a/accounts/self/capabilities?format=JSON HTTP/1.0
  Authorization: Digest username="admin", realm="Gerrit Code Review", nonce="...

  )]}'
  {
    "administrateServer": true,
    "queryLimit": {
      "min": 0,
      "max": 500
    },
    "createAccount": true,
    "createGroup": true,
    "createProject": true,
    "killTask": true,
    "viewCaches": true,
    "flushCaches": true,
    "viewConnections": true,
    "viewQueue": true,
    "startReplication": true
  }</tt></pre>
</div></div>
<div class="paragraph"><p>To filter the set of global capabilities the <tt>q</tt> parameter can be used.
Filtering may decrease the response time by avoiding looking at every
possible alternative for the caller.</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /a/accounts/self/capabilities?format=JSON&amp;q=createAccount&amp;q=createGroup HTTP/1.0
  Authorization: Digest username="admin", realm="Gerrit Code Review", nonce="...

  )]}'
  {
    "createAccount": true,
    "createGroup": true
  }</tt></pre>
</div></div>
<div class="paragraph"><p>Most results are boolean, and a field is only present when its value
is <tt>true</tt>. <a href="json.html#queryLimit"><tt>queryLimit</tt></a> is a range and is
presented as a nested JSON object with <tt>min</tt> and <tt>max</tt> members.</p></div>
</div>
<div class="sect2">
<h3 id="projects">/projects/ (List Projects)</h3>
<div class="paragraph"><p>Lists the projects accessible by the caller. This is the same as
using the <a href="cmd-ls-projects.html">ls-projects</a> command over SSH,
and accepts the same options as query parameters.</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /projects/?format=JSON&amp;d HTTP/1.0

  HTTP/1.1 200 OK
  Content-Disposition: attachment
  Content-Type: application/json;charset=UTF-8

  )]}'
  {
    "external/bison": {
      "description": "GNU parser generator"
    },
    "external/gcc": {},
    "external/openssl": {
      "description": "encryption\ncrypto routines"
    },
    "test": {
      "description": "\u003chtml\u003e is escaped"
    }
  }</tt></pre>
</div></div>
<div class="paragraph" id="suggest-projects"><p>The <tt>/projects/</tt> URL also accepts a prefix string as part of the URL.
This limits the results to those projects that start with the specified
prefix.
List all projects that start with <tt>platform/</tt>:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>GET /projects/platform/?format=JSON HTTP/1.0
HTTP/1.1 200 OK
Content-Disposition: attachment
Content-Type: application/json;charset=UTF-8
)]}'
{
"platform/drivers": {},
"platform/tools": {}
}</tt></pre>
</div></div>
<div class="paragraph"><p>E.g. this feature can be used by suggestion client UI&#8217;s to limit results.</p></div>
</div>
<div class="sect2">
<h3 id="changes">/changes/ (Query Changes)</h3>
<div class="paragraph"><p>Queries changes visible to the caller. The query string must be
provided by the <tt>q</tt> parameter. The <tt>n</tt> parameter can be used to limit
the returned results.</p></div>
<div class="paragraph"><p>Query for open changes of watched projects:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /changes/?format=JSON&amp;q=status:open+is:watched&amp;n=2 HTTP/1.0

  HTTP/1.1 200 OK
  Content-Disposition: attachment
  Content-Type: application/json;charset=UTF-8

  )]}'
  {
    "project": "demo",
    "branch": "master",
    "id": "Idaf5e098d70898b7119f6f4af5a6c13343d64b57",
    "subject": "One change",
    "status": "NEW",
    "created": "2012-07-17 07:18:30.854000000",
    "updated": "2012-07-17 07:19:27.766000000",
    "reviewed": true,
    "_sortkey": "001e7057000006dc",
    "_number": 1756,
    "owner": {
      "name": "John Doe"
    },
  },
  {
    "project": "demo",
    "branch": "master",
    "id": "I09c8041b5867d5b33170316e2abc34b79bbb8501",
    "subject": "Another change",
    "status": "NEW",
    "created": "2012-07-17 07:18:30.884000000",
    "updated": "2012-07-17 07:18:30.885000000",
    "_sortkey": "001e7056000006dd",
    "_number": 1757,
    "owner": {
      "name": "John Doe"
    },
    "_more_changes": true
  }</tt></pre>
</div></div>
<div class="paragraph"><p>The change output is sorted by the last update time, most recently
updated to oldest update.</p></div>
<div class="paragraph"><p>If the <tt>n</tt> query parameter is supplied and additional changes exist
that match the query beyond the end, the last change object has a
<tt>_more_changes: true</tt> JSON field set. Callers can resume a query with
the <tt>n</tt> query parameter, supplying the last change&#8217;s <tt>_sortkey</tt> field
as the value. When going in the reverse direction with the <tt>p</tt> query
parameter a <tt>_more_changes: true</tt> is put in the first change object if
there are results <strong>before</strong> the first change returned.</p></div>
<div class="paragraph"><p>Clients are allowed to specify more than one query by setting the <tt>q</tt>
parameter multiple times. In this case the result is an array of
arrays, one per query in the same order the queries were given in.</p></div>
<div class="paragraph"><p>Query that retrieves changes for a user&#8217;s dashboard:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /changes/?format=JSON&amp;q=is:open+owner:self&amp;q=is:open+reviewer:self+-owner:self&amp;q=is:closed+owner:self+limit:5&amp;o=LABELS HTTP/1.0

  HTTP/1.1 200 OK
  Content-Disposition: attachment
  Content-Type: application/json;charset=UTF-8

  )]}'
  [
    [
      {
        "project": "demo",
        "branch": "master",
        "id": "Idaf5e098d70898b7119f6f4af5a6c13343d64b57",
        "subject": "One change",
        "status": "NEW",
        "created": "2012-07-17 07:18:30.854000000",
        "updated": "2012-07-17 07:19:27.766000000",
        "reviewed": true,
        "_sortkey": "001e7057000006dc",
        "_number": 1756,
        "owner": {
          "name": "John Doe"
        },
        "labels": {
          "Verified": {},
          "Code-Review": {}
        }
      }
    ],
    [],
    []
  ]</tt></pre>
</div></div>
<div class="paragraph"><p>Additional fields can be obtained by adding <tt>o</tt> parameters, each
option requires more database lookups and slows down the query
response time to the client so they are generally disabled by
default. Optional fields are:</p></div>
<div class="ulist"><ul>
<li>
<p>
<tt>LABELS</tt>: a summary of each label required for submit, and
  approvers that have granted (or rejected) with that label.
</p>
</li>
<li>
<p>
<tt>CURRENT_REVISION</tt>: describe the current revision (patch set)
  of the change, including the commit SHA-1 and URLs to fetch from.
</p>
</li>
<li>
<p>
<tt>ALL_REVISIONS</tt>: describe all revisions, not just current.
</p>
</li>
<li>
<p>
<tt>CURRENT_COMMIT</tt>: parse and output all header fields from the
  commit object, including message. Only valid when the current
  revision or all revisions are selected.
</p>
</li>
<li>
<p>
<tt>ALL_COMMITS</tt>: parse and output all header fields from the
  output revisions. If only <tt>CURRENT_REVISION</tt> was requested
  then only the current revision&#8217;s commit data will be output.
</p>
</li>
<li>
<p>
<tt>CURRENT_FILES</tt>: list files modified by the commit, including
  basic line counts inserted/deleted per file. Only valid when
  the current revision or all revisions are selected.
</p>
</li>
<li>
<p>
<tt>ALL_FILES</tt>: list files modified by the commit, including
  basic line counts inserted/deleted per file. If only the
  <tt>CURRENT_REVISION</tt> was requested the only that commit&#8217;s
  modified files will be output.
</p>
</li>
</ul></div>
<div class="listingblock">
<div class="content">
<pre><tt>  GET /changes/?q=97&amp;format=JSON&amp;o=CURRENT_REVISION&amp;o=CURRENT_COMMIT&amp;o=CURRENT_FILES HTTP/1.0

  HTTP/1.1 200 OK
  Content-Disposition: attachment
  Content-Type: application/json;charset=UTF-8

  )]}'
  [
    {
      "project": "gerrit",
      "branch": "master",
      "id": "I7ea46d2e2ee5c64c0d807677859cfb7d90b8966a",
      "subject": "Use an EventBus to manage star icons",
      "status": "NEW",
      "created": "2012-04-25 00:52:25.580000000",
      "updated": "2012-04-25 00:52:25.586000000",
      "_sortkey": "001c9bf400000061",
      "_number": 97,
      "owner": {
        "name": "Shawn Pearce"
      },
      "current_revision": "184ebe53805e102605d11f6b143486d15c23a09c",
      "revisions": {
        "184ebe53805e102605d11f6b143486d15c23a09c": {
          "_number": 1,
          "fetch": {
            "git": {
              "url": "git://localhost/gerrit",
              "ref": "refs/changes/97/97/1"
            },
            "http": {
              "url": "http://127.0.0.1:8080/gerrit",
              "ref": "refs/changes/97/97/1"
            }
          },
          "commit": {
            "parents": [
              {
                "commit": "1eee2c9d8f352483781e772f35dc586a69ff5646",
                "subject": "Migrate contributor agreements to All-Projects."
              }
            ],
            "author": {
              "name": "Shawn O. Pearce",
              "email": "sop@google.com",
              "date": "2012-04-24 18:08:08.000000000",
              "tz": -420
            },
            "committer": {
              "name": "Shawn O. Pearce",
              "email": "sop@google.com",
              "date": "2012-04-24 18:08:08.000000000",
              "tz": -420
            },
            "subject": "Use an EventBus to manage star icons",
            "message": "Use an EventBus to manage star icons\n\nImage widgets that need to ..."
          },
          "files": {
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeCache.java": {
              "lines_deleted": 8
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeDetailCache.java": {
              "lines_inserted": 1
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java": {
              "lines_inserted": 11,
              "lines_deleted": 19
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java": {
              "lines_inserted": 23,
              "lines_deleted": 20
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarCache.java": {
              "status": "D",
              "lines_deleted": 139
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarredChanges.java": {
              "status": "A",
              "lines_inserted": 204
            },
            "gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java": {
              "lines_deleted": 9
            }
          }
        }
      }
    }
  ]</tt></pre>
</div></div>
</div>
</div>
</div>
<hr style="
  height: 2px;
  color: silver;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
">
<div class="paragraph"><p>Part of <a href="index.html">Gerrit Code Review</a></p></div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.5<br />
Last updated 2012-10-31 19:34:02 CET
</div>
</div>
</body>
</html>
